package com.xiaoming.config;

import com.xiaoming.properties.DemoProperties;
import com.xiaoming.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 * 定义自己的自动配置 DemoAutoConfiguration，
 * 并将核心功能类DemoService放入到Spring Context容器中
 *
 * EnableConfigurationProperties  配置DemoProperties 这个bean的支持
 * 也就是@EnableConfigurationProperties注解告诉Spring Boot 能支持@ConfigurationProperties。
 * 也可以在 @ConfigurationProperties 注解的类上添加 @Configuration 或者  @Component 注解
 *
 * ConditionalOnProperty 控制 @Configuration 是否生效
 * 简单来说也就是我们可以通过在yml配置文件中控制 @Configuration 注解的配置类是否生效。
 */
@Configuration
@EnableConfigurationProperties(DemoProperties.class)
@ConditionalOnProperty(prefix = "demo.person", value = "enabled", matchIfMissing = true)
public class DemoAutoConfiguration {

    @Autowired
    private DemoProperties demoProperties;

    /**
     * 当容器中没有指定Bean的情况下，自动配置
     * @return
     */
    @Bean(name="demoService")
    @ConditionalOnMissingBean({DemoService.class})
    public DemoService demoService(){
        return new DemoService(demoProperties);
    }

//    @ConditionalOnClass: 当类路径 classpath 下有指定的类的情况下进行自动配置
//    @ConditionalOnMissingClass: 当类路径 classpath 下没有指定的类的情况下进行自动配置
//    @ConditionalOnMissingBean: 当容器(Spring Context)中没有指定 Bean 的情况下进行自动配置
//    @ConditionalOnBean: 当容器(Spring Context)中有指定 Bean 的情况下进行自动配置
//    @ConditionalOnProperty(prefix = "demo.person", value = "enabled", matchIfMissing = true): 当配置文件中国demo.person.enabled=true时进行自动配置,没有设置此值就默认使用matchIfMissing对于的值

}
